/*
Copyright 2010,2011 Matt Van Der Westhuizen

This file is part of CGLL.

CGLL is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

CGLL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with CGLL.  If not, see <http://www.gnu.org/licenses/>.
*/

package org.chaoticengine.cgll.entity.component.render;

import org.chaoticengine.cgll.entity.component.RenderComponent;
import org.newdawn.slick.Color;
import org.newdawn.slick.Font;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.geom.Vector2f;
import org.newdawn.slick.state.StateBasedGame;
import org.simpleframework.xml.Element;

/**
 * Component for rendering game entities by using a image representation. The
 * bounding rectangle for the entity is set as the size of the image.
 *
 * @author Matt v.d. Westhuizen
 */
public class TextRenderComponent extends RenderComponent {
    protected Font font = null;
    protected Color color = Color.white;
    protected boolean rotate = true;

    public TextRenderComponent() {
        super();
    }

    @Element(name="font")
    public void setFont(Font f) {
        this.font = f;
    }

    @Element(name="font")
    public Font getFont() {
        return(font);
    }

    @Element(name="color")
    public Color getColor() {
        return color;
    }

    @Element(name="color")
    public void setColor(Color color) {
        this.color = color;
    }

    @Element(name="rotate", required=false)
    public boolean isRotate() {
        return rotate;
    }

    @Element(name="rotate", required=false)
    public void setRotate(boolean rotate) {
        this.rotate = rotate;
    }

    @Override
    public void onSetOwner() {
        int h = font.getHeight(owner.getName());
        int w = font.getWidth(owner.getName());

        Vector2f pos = owner.getPosition();
        owner.setBounds(new Rectangle(pos.getX() - w / 2.0f,
                pos.getY() - h / 2.0f,
                w,
                h));
        owner.setPosition(new Vector2f(owner.getBounds().getCenter()));
        owner.setTranslation(new Vector2f(-w / 2.0f, -h / 2.0f));
    }

    @Override
    public void render(GameContainer gc, StateBasedGame sb, Graphics gr) {
        // Translation & rotation
        gr.translate(owner.getPosition().x, owner.getPosition().y);
        if (rotate) {
            gr.rotate(0.0f, 0.0f, owner.getRotation());
        }
        gr.translate(owner.getTranslation().x, owner.getTranslation().y);

        // Rendering
        Font oldFont = gr.getFont();
        gr.setFont(font);
        gr.setColor(color.multiply(new Color(1.0f, 1.0f, 1.0f, owner.getAlpha())));
        gr.drawString(owner.getName(), 0.0f, 0.0f);
        gr.setFont(oldFont);

        // Undo translation & rotation
        gr.translate(-owner.getTranslation().x, -owner.getTranslation().y);
        if (rotate) {
            gr.rotate(0.0f, 0.0f, -owner.getRotation());
        }
        gr.translate(-owner.getPosition().x, -owner.getPosition().y);
    }
}
